import random

class IndiceDeCategorias:
	def __init__(self, nombre, definiciones=set(), conjuntoDeIndices=set()):
		self.__nombre = nombre
		self.__subindices = conjuntoDeIndices.copy()
		self.__definiciones = definiciones

	def nombre(self):
		return self.__nombre

	def subindices(self):
		return self.__subindices.copy()

	def definiciones(self):
		return self.__definiciones.copy()

	def buscarCategoria(self, ruta):
		#self.buscarCategoriaEn( self, ruta, self.categorias)
		categoriaActual = self
		for categoria in ruta:
			[categoriaActual] = filter( lambda a: a.__nombre == categoria, categoriaActual.__subindices )
		return categoriaActual

	def buscarDefinicionesDe(self, ruta, cantidad):
		""" Esto no deberia estar aca """
		categoria = self.buscarCategoria(ruta)
		return random.sample( categoria.todasLasDefiniciones(), cantidad)

	def todasLasDefiniciones(self):
		definicionesDeIndice = self.__definiciones;
		listaDeDefinicionesDeSubcategorias = [ subindice.todasLasDefiniciones() for subindice in self.__subindices]
		definicionesDeSubcategorias = reduce( set.union, listaDeDefinicionesDeSubcategorias, set())
		return definicionesDeSubcategorias.union(definicionesDeIndice);

	def __repr__(self):
		if len(self.__subindices) > 0 :
			return "<"+self.__nombre+" "+self.__subindices.__repr__()+">"
		else:
			return "<"+self.__nombre+">"

class FabricaDeIndice:

	def nuevoIndice( self ):
		categoriaHistoriaPersonajes = IndiceDeCategorias("personajes historicos",set(["Napoleon","SanMartin","Bolivar"]))
		categoriaHistoria = IndiceDeCategorias("historia", set(), set([categoriaHistoriaPersonajes]) )
		
		return IndiceDeCategorias( "Todo", set(), set([categoriaHistoria]))

f = FabricaDeIndice()
indice = f.nuevoIndice()
